package day22;

import java.util.concurrent.*;

//定义自定义线程池
public class Demo5 {
    //先定义7个参数
    //1、定义核心线程数:设置规则，一般是通过自己电脑的CPU数决定
    //用于获取自己电脑的CPU线程数
    //Runtime.getRuntime().availableProcessors();
    private static final int core_num=10;
    //2.定义最大核心线程数：设置规则一般是设置为核心线程数的2倍
    private static final int max_num=20;
    //3.定义（多余线程最大数量-核心线程数）存活时间
    private static final long alive_time=30;
    //4.定义时间单位
    private static final TimeUnit unit=TimeUnit.SECONDS;
    //5.工作队列：
    private static final BlockingQueue<Runnable> queue=new ArrayBlockingQueue<>(core_num);
    //6.线程工厂
    private static ThreadFactory factory= Executors.defaultThreadFactory();
    //7.拒绝策略
    private static RejectedExecutionHandler handler=new ThreadPoolExecutor.AbortPolicy();
    //8.定义线程池对象
    private static ExecutorService pool=new ThreadPoolExecutor(
            core_num,
            max_num,
            alive_time,
            unit,
            queue,
            factory,
            handler
    );
    //9.执行自定义线程池中的任务 参考execute()
    //返回值true表示执行成功，flase表示失败
    public static boolean myExecute(Runnable r){
        try {
            pool.execute(r);
            return true;
        }catch (Exception e){
            System.out.println("任务执行失败！");
            return false;
        }
    }
    //10.执行线程池中的任务（Callable c）
    //访问修饰符  静态的  <S>自定义泛型  返回值类型  方法名（参数）
    public static <S> Future<S> myExecute(Callable<S> c){
        Future f= null;
        try {
            f = pool.submit(c);
        } catch (Exception e) {
            System.out.println("任务执行失败！");
        }
        return f;
    }
    //11.测试
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        for (int i=0;i<10;i++){
            //传入Runnable类型
            Demo5.myExecute(()->{
               System.out.println("123456");
            });
            //传入Callable类型
            Future<Integer> f=Demo5.myExecute(()->{
                System.out.println("678910");
                return 123;
            });
            System.out.println("Callable结果："+f.get());
        }
        pool.shutdown();
    }
}
